package models;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import play.db.jpa.Model;

public class Pedido extends Model {
	private Cliente cliente;
	private Endereco endereco;
	private String usuarioUltimaAlteracao;
	private Calendar dataPedido;
	private Calendar dataUltimaAlteracao;
	private long numero;
	private String status;
	private List<ItemPedido> itens;
	private int quantidade;
	private boolean ehClienteCadastrado;
	
	public Pedido(Cliente cliente,String usuarioUltimaAlteracao,Calendar dataPedido,Calendar dataUltimaAlteracao,
			long numero,String status,List<ItemPedido> itens,int quantidade,boolean ehClienteCadastrado){
		this.cliente = cliente;
		this.usuarioUltimaAlteracao = usuarioUltimaAlteracao;
		this.dataPedido = dataPedido;
		this.dataUltimaAlteracao = dataUltimaAlteracao;
		this.numero = numero;
		this.status = status;
		this.itens = itens;
		this.quantidade = quantidade;
		this.ehClienteCadastrado = ehClienteCadastrado;
	}
	
	
	public Pedido(){
		cliente = null;
		usuarioUltimaAlteracao = null;
		dataPedido = null;
		dataUltimaAlteracao = null;
		numero = -1;
		status = "aberto";
		itens = new ArrayList<ItemPedido>();
		this.quantidade=0;
		
	}

	public Pedido(Cliente cliente, Calendar dataPedido, Calendar dataEntrega,
			long numero, String status) {
		this.cliente = cliente;
		this.usuarioUltimaAlteracao = null;
		this.dataPedido = dataPedido;
		this.dataUltimaAlteracao = dataEntrega;
		this.numero = numero;
		this.status = status;
		this.itens = new ArrayList<ItemPedido>();
	}

	public Pedido(Calendar dataPedido, Calendar dataEntrega, long numero, String status) {
		this.cliente = null;
		this.dataPedido = dataPedido;
		this.dataUltimaAlteracao = dataEntrega;
		this.numero = numero;
		this.status = status;
		this.itens = new ArrayList<ItemPedido>();
		
	}
	
	
	public Cliente getCliente(){
		return this.cliente;
	}
	
	public void setCliente(Cliente cliente){
			this.cliente = cliente;
			this.endereco = cliente.getEnderecoEntrega();
		
	}
	
	public Endereco getEnderecoEntrega(){
		return this.endereco;
	}

	public long getNumero() {
		return this.numero;
	}
	
	public void setNumero(long numero){
		this.numero = numero;
	}

	public Calendar getDataPedido() {
		return this.dataPedido;
	}
	
	public void setDataPedido(Calendar data){
		this.dataPedido = data;
	}

	public Calendar getDataUltimaAlteracao() {
		return this.dataUltimaAlteracao;
	}
	
	public void setDataUltimaAteracao(Calendar data){
		this.dataUltimaAlteracao = data;
	}

	public double getValorTotal() {
		double valor = 0.00;
		for (int i = 0; i < itens.size(); i++) {
			valor += itens.get(i).getValorTotal();
		}

		return valor;

	}

	public String getStatus() {
		return this.status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	// Falta modificar aqui, caso o produto já esteja na lista
	public void adicionarProduto(Produto produto, int quantidade) {
		int indice = this.obterIndiceElemento(produto);
		if(indice==-1){
			this.itens.add(new ItemPedido(produto,quantidade));
			this.quantidade++;
		}else{
			this.itens.get(indice).setQuantidade(quantidade);
			
		}
		

	}
	
	

	public void removerProduto(String nome, int quantidade) {
		int idx = -1;
		for (int i = 0; i < itens.size(); i++) {
			if (itens.get(i).getProduto().getNome().equals(nome)) {
				idx = i;
				break;
			}
		}

		if (idx != -1) {
			if (itens.get(idx).getQuantidade() >= 1) {
				itens.get(idx)
						.setQuantidade(itens.get(idx).getQuantidade() - 1);
				this.quantidade--;
			} else {
				itens.remove(idx);
				this.quantidade--;
			}
		}

	}
	
	public void removerProdutos(){
		this.itens = new ArrayList<ItemPedido>();
	}
	
	public int getQuantidade(){
		return this.quantidade;
	}
	
	public ItemPedido getItem(String nome){
		for(int i=0;i < this.itens.size();i++){
			if(this.itens.get(i).getNome().equals(nome)){
				return itens.get(i);
			}
		}
		return null;//vou mudar aki
	}

	public List<ItemPedido> getItens() {
		return this.itens;
	}
	
	
	
	public String getUsuarioUltimaAlteracao(){
		return this.usuarioUltimaAlteracao;
	}
	
	public void setAlteradoPor(String administrador){
		this.usuarioUltimaAlteracao = administrador;
	}
	
	
	private int obterIndiceElemento(Produto produto){
		for(int i=0;i< this.itens.size();i++){
			if((itens.get(i).getProduto()).getNome().equals(((Donut)produto).getNome())){
				return i;
				
			}
		}
		return -1;
		
	}
	
	public boolean ehClienteCadastrado(){
		return this.ehClienteCadastrado;
	}
	
	public void setClienteCadastrado(boolean ehCadastrado){
		this.ehClienteCadastrado = ehCadastrado;
	}
	

	
	public void setRemovido(boolean removido){
	}
	
	public void finalizarPedido(){
		    
			this.status = "pendente";
			this.dataPedido = new GregorianCalendar();
			this.numero = GeradorDeNumero.gerarNumero();
		
	}
	
	public void zerar(){
		cliente = null;
		usuarioUltimaAlteracao = null;
		dataPedido = null;
		dataUltimaAlteracao = null;
		numero = -1;
		status = "aberto";
		itens = new ArrayList<ItemPedido>();
		this.quantidade=0;
	}
	

}
